home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / ask / askdates / source / askdtfmt.c < prev   
Text File  |  1998-08-21  |  5KB  |  210 lines

  1. /*****************************************************************************/
  2. // ASKDatesのフォーマットファイルのテキスト→バイナリー変換をする
  3. /*****************************************************************************/
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>    // exit()
  8. #include "defines.h"
  9. #include "aparam.h"
  10. #include "astdio.h"
  11. #include "adisk.h"    // fd_path
  12. #include "amacro.h"
  13.  
  14. const char prog[]="@@> ASKDtFmt.C : 1998/08/21 FRI : UTILITY : ASKDtFmt";
  15.  
  16. /*****************************************************************************/
  17.  
  18. #define    SINO    0xff    // 識別子
  19.  
  20. typedef struct {
  21.     unchar    *name;    // 識別子名
  22.     short    code;    // 識別番号;$ffは入れない
  23. } SIKIBETU;
  24.  
  25. SIKIBETU sym[]={
  26.      {"YYY4",0x01}    // 西暦4桁
  27.     ,{"Y2"    ,0x02}    // 西暦下2桁
  28.     ,{"GG"    ,0x03}    // 平成2桁
  29.     ,{"G2"    ,0x03}    // 平成2桁
  30.     ,{"MM"    ,0x04}    // 月2桁
  31.     ,{"M2"    ,0x04}    // 月2桁
  32.     ,{"DD"    ,0x05}    // 日2桁
  33.     ,{"D2"    ,0x05}    // 日2桁
  34.     ,{"WE3"    ,0x06}    // 曜日英字3桁
  35.     ,{"WJ"    ,0x07}    // 曜日日本語1桁
  36.     ,{"H2"    ,0x08}    // 24時制時間
  37.     ,{"H1"    ,0x09}    // 12時制時間
  38.     ,{"AP"    ,0x0a}    // AM/PM
  39.     ,{"FF"    ,0x0b}    // 分
  40.     ,{"F2"    ,0x0b}    // 分
  41.     ,{"SS"    ,0x0c}    // 秒
  42.     ,{"S2"    ,0x0c}    // 秒
  43. };
  44. #define    SYMS    (sizeof(sym)/sizeof(SIKIBETU))
  45.  
  46. #define    HEADER    "ASKDates FMT1\x0d\x0a\x1a"
  47. #define    HEADLEN    (sizeof(HEADER)-1)    // EOSは入らない
  48.  
  49. #define    LMAX    78    // 1行の最大バイト数
  50.  
  51. /*****************************************************************************/
  52.  
  53. int Txt2Bin(unchar *fntxt,unchar *fnbin)
  54. // テキストをバイナリに変換する
  55. {
  56. FILE *fpt,*fpb;
  57. int ret=0,len,i;
  58. unchar line[LMAX],buff[LMAX],*s,*b,c;
  59.     fpt=fopen(fntxt,"rt");
  60.     if (fpt==NULL) {
  61.         printsn("テキストファイルが見つかりません:",fntxt);
  62.         return(1);
  63.     }
  64.     fpb=fopen(fnbin,"wb");
  65.     if (fpb==NULL) {
  66.         fclose(fpt);
  67.         printsn("バイナリファイルが作成できません:",fnbin);
  68.         return(2);
  69.     }
  70.     // ヘッダー書き出し
  71.     fwrite(HEADER,HEADLEN,1,fpb);
  72.     // メイン
  73.     while (!read1line1(fpt,line,LMAX)) { // 1行読み出し
  74.         s=line;
  75.         if (*s==0) continue; // 空行
  76.         len=1; // 最後のEOSの分
  77.         b=buff;
  78.         while ((c=*s++)!=0) {
  79.             if (check_kanji1(c)) { // 2バイト文字
  80.                 len+=2;
  81.                 if (len>=LMAX) goto LENOVER;
  82.                 *b++=c;
  83.                 *b++=*s++;
  84.                 continue;
  85.             }
  86.             if (c<' ') {
  87.                 printsn("コントロールコードが入っています:",line);
  88.                 ret=4;
  89.                 break;
  90.             }
  91.             // 識別子チェック
  92.             for (i=0;i<SYMS;i++) {
  93.                 unchar *nm;
  94.                 nm=sym[i].name;
  95.                 if (toupper(c)==*nm) { // 先頭1文字一致
  96.                     int ln;
  97.                     ln=strlen(++nm);
  98.                     if (memcmpi(s,nm,ln)==0) { // 一致
  99.                         s+=ln; // 一致した部分を飛ばす
  100.                         if (++len>=LMAX) goto LENOVER;
  101.                         *b++=SINO;
  102.                         c=sym[i].code;
  103.                         break;
  104.                     }
  105.                 }
  106.             }
  107.             // 普通文字である
  108.             if (++len>=LMAX) {
  109.                 LENOVER:;
  110.                 printsn("1行の長さが長すぎます:",line);
  111.                 ret=3;
  112.                 break;
  113.             }
  114.             *b++=c;
  115.         }
  116.         *b=0; // End of line
  117.         fwrite(buff,len,1,fpb);
  118.     }
  119.     if (ferror(fpt)) ret=10;
  120.     if (ferror(fpb)) ret=11;
  121.     fclose(fpb);
  122.     fclose(fpt);
  123.     return(ret);
  124. }
  125.  
  126. /*****************************************************************************/
  127.  
  128. int BinLook(unchar *fnbin)
  129. // バイナリの内容を表示する
  130. {
  131. int ret=0,c,i;
  132. FILE *fpb;
  133. unchar line[LMAX];
  134.     fpb=fopen(fnbin,"rb");
  135.     if (fpb==NULL) {
  136.         printsn("バイナリファイルが見つかりません:",fnbin);
  137.         return(1);
  138.     }
  139.     // ヘッダー読み出し
  140.     fread(line,HEADLEN,1,fpb);
  141.     if (memcmp(line,HEADER,HEADLEN)) {
  142.         printsn("これはASKDatesフォーマットバイナリファイルではありません:",fnbin);
  143.         return(2);
  144.     }
  145.     // 内容表示
  146.     //    HEADER
  147.     //    ...[00]
  148.     do {
  149.         // 1行読み出し
  150.         while (c=fgetc(fpb),c!=0&&c!=-1) {
  151.             if (c==SINO) {
  152.                 c=fgetc(fpb); // 識別番号
  153.                 for (i=0;i<SYMS;i++) {
  154.                     if (sym[i].code==c) {
  155.                         prints(sym[i].name);
  156.                         break;
  157.                     }
  158.                 }
  159.             } else printc(c);
  160.         }
  161.         crlf();
  162.     } while (c!=-1); // EOFまで
  163.     fclose(fpb);
  164.     return(ret);
  165. }
  166.  
  167. /*****************************************************************************/
  168.  
  169. void main(int argc,unchar *argv[])
  170. {
  171. unchar *fntxt,fnbin[MAXPATH];
  172. int i,ret;
  173. int fhelp=0,frev;
  174.     /* オプションチェック初期化 */
  175.     clear_param();
  176.     HELP:;
  177.     if (helpcom(argc,argv,fhelp,"ASKDtFmt","[/B] テキスト [バイナリ[.ask]]")) exit(fhelp? fhelp:255);
  178.     
  179.     /* 強制バイナリ内容表示モード */
  180.     frev=check_param2("B",argv,argc,0);
  181.     
  182.     /* オプションチェック */
  183.     i=check_param_error(argv,argc);
  184.     if (i) {
  185.         printsn("\aオプションエラーです:",argv[i]);
  186.         exit(1);
  187.     }
  188.     
  189.     // ファイル名取得
  190.     i=getfname(argc,argv,1,NULL);
  191.     if (i==0) { // ファイル名がない
  192.         fhelp=100;
  193.         goto HELP;
  194.     }
  195.     fntxt=argv[i];
  196.     ret=0;
  197.     if (!frev) { // 通常モード
  198.         i=getfname(argc,argv,2,NULL);
  199.         fnget(fnbin,i==0? fntxt:fd_path(argv[i]),"ask");
  200.         printss(fntxt,"→");
  201.         printss(fnbin,"\n");
  202.         ret=Txt2Bin(fntxt,fnbin);
  203.     } else { // バイナリー内容表示モード
  204.         ret=BinLook(fntxt);
  205.     }
  206.     exit(ret);
  207. }
  208.  
  209. /*****************************************************************************/
  210.